fn main() {
    println!("解构结构体");

    // 定义一个结构体, x 元组(u32,u32) y i32
    struct Foo {
        x: (u32, u32),
        y: i32,
    }

    // 实例化一个 Foo
    let foo = Foo { x: (1, 2), y: 3 };
    // 解构
    let Foo { x: (a, b), y } = foo;
    println!("解析后的值, x:({a},{b}) y:{y}");
    // 解构并重命名
    let Foo { y: j, .. } = foo;
    println!("只解析 y: {j}");

    struct XY {
        x: i32,
        y: i32,
    }

    let xy = XY { x: 3, y: 2 };
    // 解析并重命名,顺序不重要
    let XY { y: i, x: j } = xy;
    println!("XY解构: {j},{i}");

    // match 中使用 if 过滤匹配, 称为卫语句
    match &xy {
        // 用 &xy 替代  xy, 引用后, 可在后面继续使用
        i if i.x == i.y => println!("x,y相等"),
        i if i.x > i.y => println!("x>y"),
        _ => println!("其他情况"),
    }

    // @ 符号的使用
    match &xy {
        i @ XY { x: 3, y: 2 } => println!("{}", i.y), // 未使用 i 则加上前缀 _
        i @ XY { x: 2, y: 3 } => println!("{}", i.x),
        _ => (),
    }
}
